#include<bits/stdc++.h>
#define lowbit(i) i&(-i)
using namespace std;
const int maxn=1001000+5;
int dep[100005];
int p[100005],tag[100005];
int elast[100005];
struct Edge {
	int u,v;
} e[200005];
int E=0;
void get_add(int x,int y) {
	e[++E].u=y;
	e[E].v=elast[x];
	elast[x]=E;
}
void dfs(int x,int fa) {
	dep[x]=fa;
	for( int i=elast[x]; i; i=e[i].v) {
		int y=e[i].u;
		if(y==fa) continue;
		dfs(y,x);
	}
}
int getsum(int x) {
	int ans=0;
	while(x) ans+=p[x],x-=lowbit(x);
	return ans;
}
int read(){
	int x;
	scanf("%d",&x);
	return x;
}
int main() {
	int n=read(),m=read();
	for(int i=1; i<=n; i++)p[i]=read();
	for(int i=1,u,v; i<n; i++) {
		u=read(),v=read();
		get_add(u,v);
		get_add(v,u);
	}
	dfs(1,0);
	for(int i=1; i<=m; i++) {
		int ans=0,y;
		int way=read(),x=read(); 
		if(way==3) {
			int tmp=1;
			ans=getsum(p[x]);
			printf("%d\n",ans);
		} else {
			y=read();
			if(way==1) p[x]+=y;
			else tag[x]+=y;
		}
	}
	return 0;
}